home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / GW AdaEd 1.4.2 / GWAdaDemos / NYUDemos / CONCORD.ADA < prev    next >
Text File  |  1993-12-20  |  5KB  |  206 lines

  1. with text_io; use text_io;
  2. with list_package;
  3. procedure concordance is
  4.  
  5.     package int_io is new integer_io(integer); use int_io;
  6.     package line_list is new list_package(natural); use line_list;
  7.  
  8.     type vstring is access string;
  9.     type word_node;
  10.     type word_link is access word_node;
  11.     subtype alpha is character range 'A'..'z' ;
  12.     
  13.     type word_node is 
  14.                     -- For words in text as stored 
  15.       record                -- in binary search tree.
  16.     word: vstring;
  17.     left: word_link;        -- Link to left child.
  18.     right: word_link;        -- Link to right child.
  19.     times: integer;            -- Count of occurrences.
  20.     lines: list;            -- Header for line number list.
  21.       end record;
  22.  
  23.  
  24.     root: word_link := null;        -- Root of binary search tree.
  25.     Input: File_Type;
  26.  
  27.     procedure tree_search(word: in vstring) is separate;
  28. -- Procedure to search for word in tree. If search fails, new node is
  29. -- created for it.
  30.  
  31.  
  32.     procedure print_node(node: in word_node) is separate;        
  33. -- Print out information pertaining to word in text.
  34.  
  35.  
  36.     procedure tree_traverse(node: in word_link) is separate;
  37. -- Procedure performs inorder traversal of binary tree.
  38.  
  39. function get_string(File: File_Type) return string is
  40.    n : character ;
  41.    buffer : string(1..100) ;
  42.    len: integer := 0 ;
  43.    
  44. begin
  45.    get(File, n) ;
  46.  
  47.    while (n not in alpha) loop  get(File, n) ; end loop ;
  48.  
  49.    while (n in alpha) loop
  50.        len := len + 1 ;
  51.        buffer(len) := n ;
  52.        if end_of_line then exit; end if ;
  53.        get(File, n) ;
  54.    end loop ;
  55.  
  56.    return buffer(1..len) ;
  57. end get_string ;
  58.                 
  59. begin
  60.   Open(File, In_File, "concord.dat");
  61.     -- Read words from text file into binary search tree.
  62.     loop
  63.     declare
  64.         x: vstring := new string'(get_string(File));
  65.     begin
  66.         new_line;
  67.         put_line("Next word in text: ");
  68.         put_line(x.all);
  69.         tree_search(x);    -- Search for word in tree.        
  70.     end;
  71.     end loop;
  72.  
  73. exception 
  74.     when end_error => 
  75.     new_line(5);
  76.     put_line("Alphabetized list of words in text: ");
  77.     new_line(2);
  78.     tree_traverse(root);    -- Print out contents of tree.
  79.  
  80. end concordance;
  81.  
  82.  
  83. separate(concordance)                            
  84. procedure tree_search(word: in vstring) is
  85.  
  86.     linenum : natural;
  87.     cur_node: word_link;
  88.  
  89.     function make_node return word_link is
  90.     -- Enter new node in binary tree.
  91.     x : word_link;
  92.     q : list := empty_list;
  93.  
  94.     begin
  95.     append(q, natural(line(standard_input)));
  96.     x := new word_node'
  97.             ( word =>  word,
  98.               left =>  null, 
  99.               right => null, 
  100.               times => 1, 
  101.               lines => q);
  102.     return x;
  103.  
  104.     end make_node;
  105.  
  106.  
  107. begin
  108.     -- check if tree empty
  109.     if root = null then
  110.     put_line("make root node");
  111.     root := make_node;
  112.     return;
  113.     end if;
  114.  
  115.     cur_node := root;                -- Search nonempty tree.
  116.     loop 
  117.     put_line("node examined: ");
  118.     put_line(cur_node.word.all);
  119.     if cur_node.word.all = word.all then    -- Word already seen.
  120.         put_line("word already seen");
  121.         cur_node.times :=
  122.         cur_node.times + 1;
  123.         linenum := natural(line(standard_input));
  124.         if last(cur_node.lines) /= linenum then
  125.         -- Add line number to list if not already present.
  126.         append(cur_node.lines, linenum);
  127.         end if;
  128.         return;
  129.     elsif cur_node.word.all > word.all then
  130.         if cur_node.left = null then 
  131.         put_line("attach left child");
  132.         cur_node.left := make_node;     -- Attach left child.
  133.         return;
  134.         else                    -- Search left subtree.
  135.         put_line("search left subtree");
  136.         cur_node := cur_node.left;
  137.         end if;
  138.     else
  139.         if cur_node.right = null then      -- Attach right child.
  140.         put_line("attach right child");
  141.         cur_node.right := make_node;
  142.         return;
  143.         else                    -- Search right subtree.
  144.         put_line("search right subtree");
  145.         cur_node := cur_node.right;
  146.         end if;
  147.     end if;
  148.     end loop;
  149.  
  150. end tree_search;
  151.  
  152.  
  153.  
  154. separate(concordance)
  155. procedure print_node(node: in word_node) is
  156.  
  157.     procedure print_list is
  158.     -- Print out contents of (non-empty) line number list,
  159.     -- from front to rear.
  160.     
  161.     cur_lines : list;
  162.     item : natural;
  163.  
  164.     begin
  165.     cur_lines := node.lines;
  166.     put_line("Appears on line numbers: ");
  167.     loop
  168.         remove(cur_lines, item);
  169.         put(item);
  170.         put(" ");
  171.         if is_empty(cur_lines) then
  172.             new_line;
  173.         return;
  174.         end if;
  175.     end loop;
  176.  
  177.     end print_list;
  178.  
  179.  
  180. begin
  181.     put_line(node.word.all);
  182.     put_line("Number of times word appears: ");
  183.     put(node.times);
  184.     new_line;
  185.     print_list;            -- Print contents of line number list.
  186.     new_line;
  187.     return;
  188.  
  189. end print_node;
  190.  
  191.  
  192. separate(concordance)
  193. procedure tree_traverse(node: in word_link) is
  194. -- Inorder traversal of binary tree.
  195.  
  196. begin
  197.     if node = null then return; end if;
  198.  
  199.     tree_traverse(node.left);        -- Traverse left subtree.
  200.     print_node(node.all);
  201.     tree_traverse(node.right);        -- Traverse right subtree.
  202.  
  203.     return;
  204.  
  205. end tree_traverse;
  206.